﻿using System;
using System.Collections.Generic;
using RFServer.Database;

namespace RFServer.ServiceWCF
{
    class ServiceCommonActions
    {
        /// <summary>Выборка из базы данных</summary>
        /// <param name="arg">
        /// tag1 tag2 ...   - Return: Cписок файлов, удовлетворяющих тэгам
        /// NULL            - Return: Список всей файлов в базе данных
        /// </param>
        /// <returns>Список</returns>

        public static string[] Select(string[] keywords)
        {
            List<string> syntax;

            if (keywords != null)
                syntax = new List<string>(keywords);
            else
                syntax = new List<string>();

            syntax.Insert(0, "SELECT");

            List<string> objectes = Storage.Select(syntax.ToArray());
            return objectes.ToArray();
        }

        /// <summary>Выборка всех тэгов из базы данных</summary>
        /// <param name="arg">
        /// filename   - Return: Тэги файла filename
        /// NULL       - Return: Список всех тэгов в базе данных
        /// </param>
        /// <returns>Список</returns>

        public static string[] Tags(string[] keywords)
        {
            List<string> tags = null;

            if (keywords == null)
                tags = Storage.Tags(null);
            else
            {
                List<string> syntax = new List<string>(keywords);
                syntax.Insert(0, "TAGS");

                tags = Storage.Tags(syntax.ToArray());
            }

            return tags.ToArray();
        }

        /// <summary>Вставка в базу данных</summary>
        /// <param name="arg">
        /// tag1 ... tagN FILE|DIRECTORY|CATEGORY filename
        /// </param>
        /// <returns>true, если добавление прошло успешно</returns>

        public static bool Insert(string[] keywords)
        {
            List<string> syntax = new List<string>(keywords);
            syntax.Insert(0, "INSERT");

            return Storage.Insert(syntax.ToArray());
        }

        /// <summary>Удаление объекта из базы данных</summary>
        /// <param name="arg">
        /// OBJECT|CATEGORY object1 object2 ...
        /// </param>
        /// <returns>true, если удаление прошло успешно</returns>

        public static bool Delete(string[] keywords)
        {
            List<string> syntax = new List<string>(keywords);
            syntax.Insert(0, "DELETE");

            return Storage.Delete(syntax.ToArray());
        }

        /// <summary>
        /// Функция протоколирует команду, если установлен флажок
        /// LogAdvanced
        /// </summary>
        /// <param name="ip">IP адрес клиента</param>
        /// <param name="command">Команда</param>
        /// <param name="keywords">Параметры команды</param>

        public static void LogAdvanced(string ip, string command, string[] keywords)
        {
            string text = "[" + ip + "]: " + command + " ";

            if (keywords != null)
                foreach (string keyword in keywords)
                    text += keyword + " ";

            Setup.Log_Advanced(text);
        }
    }
}
